#ifndef IMGSTITCHER_H
#define IMGSTITCHER_H
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/opencv.hpp>
#include <opencv2/features2d/features2d.hpp>
#include <opencv2/xfeatures2d.hpp>
#include <opencv2/xfeatures2d/nonfree.hpp>
#include <vector>
#include <deque>
#include <QDebug>
using namespace std;
using namespace cv;



class ImgStitcher
{
public:
    struct four_corners_t
    {
        Point2f left_top;
        Point2f left_bottom;
        Point2f right_top;
        Point2f right_bottom;
    };

private:
    static four_corners_t m_corners;

private:
    /**
     * @brief stitchTwoImg：拼接两幅图像
     * @param img1：图像1
     * @param img2：图像2
     * @return 拼接后的图像
     */
    static cv::Mat stitchTwoImg(cv::Mat& img1, cv::Mat& img2);

    /**
     * @brief CalcCorners：计算原图像的四个点坐标经过仿射变换后在新图像中的坐标
     * @param H：放射变换矩阵
     * @param src：图像
     */
    static void CalcCorners(const Mat& H, const Mat& src);

public:
    ImgStitcher();

    /**
     * @brief stitchImgs：拼接一组图像
     * @param imgs：图像队列
     * @return 拼接完成的图像
     */
    static cv::Mat stitchImgs(deque<cv::Mat>& imgs);

    /**
     * @brief evaluateStitchRes: 评估拼接图像效果
     * @param tarImg：待评估的图像
     * @param refImg：参考图像
     * @param outImg：阈值分割后的图像，图像中白色像素点则是像素值不同的点
     * @return 像素值不同的点个数
     */
    static int evaluateRes(cv::Mat& tarImg, cv::Mat& refImg, cv::Mat& outImg);

    /**
     * @brief matchImage：图像匹配，从一幅大图像中截取出和目标图像匹配的图像
     * @param totalImg：大图像
     * @param tarImg：目标图像
     * @return 从大图像中截取的图像
     */
    static cv::Mat matchImage(cv::Mat& totalImg, cv::Mat& tarImg);
};

#endif // IMGSTITCHER_H
